package com.gouwudai.gobbs.service.impl;

import java.io.File;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.extremecomponents.table.limit.Limit;

import com.gouwudai.gobbs.common.Arguments;
import com.gouwudai.gobbs.common.Constants;
import com.gouwudai.gobbs.common.IPageList;
import com.gouwudai.gobbs.dao.IClassDAO;
import com.gouwudai.gobbs.pojo.TbbsClass;
import com.gouwudai.gobbs.service.IClassService;
import com.litt.core.common.PageParam;
import com.litt.core.exception.BusiException;
import com.litt.core.file.FileManager;
import com.litt.core.util.ExtremeTableUtil;

/**
 * 
 * <b>标题:</b> 分类版面处理服务实现类.
 * <pre><b>描述:</b> 
 *   分类版面处理服务实现类
 * </pre>
 * 
 * @author <a href="mailto:littcai@hotmail.com">空心大白菜</a>
 * @since 2007-8-24
 * @version 1.0
 *
 */
public class ClassServiceImpl implements IClassService
{
    private transient static final Log logger = LogFactory.getLog(ClassServiceImpl.class);
    
    IClassDAO classDAO;
	
    /**
     * 保存分类版面
     * @param tbbsClass 分类对象
     * @param rebuildIndex 重建分类/版面页面树标志
     * @throws BusiException
     */
	public void save(TbbsClass tbbsClass,boolean rebuildIndex) throws BusiException
	{	
		classDAO.save(tbbsClass);
        if(rebuildIndex)
            createClassFiles(); //更新前面页面文件
	}

	public TbbsClass load(Integer id)
	{		
		return (TbbsClass)classDAO.load(id);
	}

    /**
     * 分类/版面修改
     * @param tbbsClass 分类对象
     * @param rebuildIndex 重建分类/版面页面树标志
     * @throws BusiException
     */
	public void update(TbbsClass tbbsClass,boolean rebuildIndex) throws BusiException
	{
		classDAO.update(tbbsClass);
        if(rebuildIndex)
          createClassFiles();
	}

    /**
     * 更新版面统计信息,同时更新父版面和父父版面的统计信息
     * @param classId
     */
    public void updateTopicAdd(int classId,int parentId,int gradeId)
    {
		classDAO.updateTopicAdd(classId, parentId, gradeId);
	}	
	
	
    /**
     * 更新版面寄语
     * @param classId
     * @param summary
     */
    public void updateSummary(Integer classId,String summary)
    {
		classDAO.updateSummary(classId, summary);
    }

    /**
     * 删除当前分类/版面(包括子分类/版面),版面下的帖子由数据库外键关联删除不通过代码实现.
     * 
     * @param classId 分类/版面ID
     */
	public void delete(Integer classId)
	{		
       List subList = classDAO.listSub(classId);
       deleteSub(subList);      // 删除子分类/版面
       classDAO.delete(classId);//删除自己
	}
    
    /**
     * 递归删除子分类/版面
     *
     */
    private void  deleteSub(List subList)
    {
        for(int i=0;i<subList.size();i++)
        {
            TbbsClass tbbsClass = (TbbsClass)subList.get(i);
            if(tbbsClass.getClassType().intValue()==1)  //只有分类下面才会有子分类/版面
            {
                List list = classDAO.listSub(tbbsClass.getClassId());
                deleteSub(list);
            }
            classDAO.delete(tbbsClass.getClassId());
        }
    }
	
    /**
     * 查询节点下所有分类或版面     
     * @return
     */
    public List listClass(Integer parentId,Integer classType,Integer hiddenFlag)
    {
    	return classDAO.listClass(parentId, classType, hiddenFlag);    	
    } 
    
    /**
     * 递归，按层次构造结果,现在只实现了4层
     * 类别只能是分类或版面,构造下拉列表
     * @return
     */
    public List<Map> listClassByType(Integer classType,Integer hiddenFlag)
    {
    	return classDAO.listClassByType(classType, hiddenFlag);
    }
	
	public IPageList listPage(PageParam pageParam)
	{
		return classDAO.listPage(pageParam);
	}
	
	public void AutoBindingTable(javax.servlet.http.HttpServletRequest request)
	{
		Map<String,Object> conds = new HashMap<String,Object>();
        conds.put("parentId", request.getParameter("parentId"));
		Limit limit = ExtremeTableUtil.getLimit(request, Constants.DEFAULT_PAGE_SIZE);
		IPageList page = this.listPage(new PageParam(conds,limit.getPage(), limit.getCurrentRowsDisplayed(),ExtremeTableUtil.getSort(limit)));
		request.setAttribute("resultList",page.getRsList());
		request.setAttribute("totalRows",page.getTotalSize());
	}
    
    /**
     * 构建静态分类/版面树
     * @return StringBuffer
     * 
     * 
     */
    private StringBuffer buildMenu()
    {  
        StringBuffer frameBar = new StringBuffer(500);//classTree的树对象在客户端已生成,这里增加子节点
        List rsList = classDAO.listClass(0,null,0);
        TbbsClass tbbsClass = null;
        for(int i=0;i<rsList.size();i++)
        {
            tbbsClass = (TbbsClass)rsList.get(i);
            Integer classId = tbbsClass.getClassId();
            Integer classType = tbbsClass.getClassType();
            
            Boolean childOpenFlag = tbbsClass.getChildOpenFlag();
            String className = tbbsClass.getClassName();

            /*********************** htmlMenu 开始收集 ***************************/
            if(classType.intValue()==0) //分类
            {
                frameBar.append("classTree.add("+classId+",0,\"");
                frameBar.append(className);                
                frameBar.append("\",\"class.jsp?classId="+ classId);
                frameBar.append("\",\"");
                frameBar.append(className);
                frameBar.append("\",''");  
                if(childOpenFlag)   //子栏目是否打开
                    frameBar.append(",'','',true");  
                frameBar.append(");");     
                buildMenu2(frameBar,classId);                
            }
            else
            {
                frameBar.append("classTree.add("+classId+",0,\"");
                frameBar.append(className);                
                frameBar.append("\",\"class.jsp?classId="+ classId);
                frameBar.append("\",\"");
                frameBar.append(className);
                frameBar.append("\",''");
                frameBar.append(");");    
            }
        } 
        frameBar.append("document.write(classTree);");        
        return frameBar;
    }
    
    /**
     * 递归方法构建静态分类/版面树
     * @param frameBar
     * @param parentId 父分类ID
     * @return StringBuffer
     */
    private StringBuffer buildMenu2(StringBuffer frameBar,Integer parentId)
    {   
        List rsList = classDAO.listClass(parentId,null,0);
        TbbsClass tbbsClass = null;
        for(int i=0;i<rsList.size();i++)
        {
            tbbsClass = (TbbsClass)rsList.get(i);
            Integer classId = tbbsClass.getClassId();
            Integer classType = tbbsClass.getClassType();
            
            Boolean childOpenFlag = tbbsClass.getChildOpenFlag();
            String className = tbbsClass.getClassName();
            /*********************** htmlMenu 开始收集 ***************************/
            if(classType.intValue()==0) //分类
            {
                frameBar.append("classTree.add("+classId+","+parentId+",\"");
                frameBar.append(className);                
                frameBar.append("\",\"class.jsp?classId="+ classId);
                frameBar.append("\",\"");
                frameBar.append(className);
                frameBar.append("\",''");  
                if(childOpenFlag)   //子栏目是否打开
                    frameBar.append(",'','',true");  
                frameBar.append(");");      
                buildMenu2(frameBar,classId);                
            }    
            else
            {
                frameBar.append("classTree.add("+classId+","+parentId+",\"");
                frameBar.append(className);                
                frameBar.append("\",\"class.jsp?classId="+ classId);
                frameBar.append("\",\"");
                frameBar.append(className);
                frameBar.append("\",''");                 
                frameBar.append(");");     
            }
        } 
        return frameBar;
    } 
    
   /**
    * 生成分类、版面树静态文件.
    * <pre><b>修改记录: </b> 
    * <b>时间:2007-8-24,描述:</b>
    *   改用dtree重构该树结构
    * </pre> 
    * 
    * @throws BusiException
    *
    */ 
   public void createClassFiles() throws BusiException
   {
       try
       {       
           StringBuilder sb = new StringBuilder(500);
           sb.append(Arguments.getRootPath());
           sb.append("club");
           sb.append(File.separator);
           sb.append("template");
           sb.append(File.separator);
           sb.append("frameBar.js");
           
           FileManager.createFile(sb.toString(),buildMenu().toString(),"UTF-8");
          
       } catch (Exception e) 
       {
           logger.error("生成分类、版面树失败！",e);
           throw new BusiException("生成分类、版面树失败！",e);           
       } 
   }
	
   public void setClassDAO(IClassDAO classDAO) {
		this.classDAO = classDAO;
	}

}